<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ed="livcos.org/ns/editor"
  xmlns:t="livcos.org/ns/cosmos/type"
  xmlns:doc="livcos.org/ns/doc"
  xmlns:c="livcos.org/ns/cosmos"
  exclude-result-prefixes="ed t c doc">
  
  <xsl:import href="Entity.xsl" />
  
  <xsl:variable name="typeBase" select="'/livcos.org/type/editor/'"/>
  
  <xsl:template match="node()|@*" mode="applyNode">
    <xsl:variable name="typeInfoUriTest">
      <xsl:value-of select="$typeBase"/>
      <xsl:value-of select="namespace-uri(.)"/>
      <xsl:if test="namespace-uri(.) != ''">/</xsl:if>
      <xsl:value-of select="local-name(.)"/>
      <xsl:text>.content</xsl:text>
    </xsl:variable>
    <xsl:variable name="typeInfoAvailable" select="doc-available($typeInfoUriTest)"/>
    <xsl:variable name="typeInfoUri">
      <xsl:choose>
        <xsl:when test="$typeInfoAvailable">
          <xsl:value-of select="$typeInfoUriTest"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="$typeBase"/>
          <xsl:apply-templates select="." mode="type"/>
          <xsl:text>.content</xsl:text>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:variable name="typeInfo" select="document($typeInfoUri)/*"/>
    <entity type="{namespace-uri(.)}/{local-name(.)}" objId="{$objId}" scope="{$scope}" id="{$id}">
    	<xsl:apply-templates select="$typeInfo/ed:input | $typeInfo/ed:editor">
    		<xsl:with-param name="params">
    			<xsl:text>type=</xsl:text>
    			<xsl:choose>
    				<xsl:when test="$typeInfoAvailable">
    					<xsl:value-of select="namespace-uri(.)"/>
    					<xsl:text>/</xsl:text>
    					<xsl:value-of select="local-name(.)"/>
    				</xsl:when>
    				<xsl:otherwise>
    					<xsl:apply-templates select="." mode="type"/>
    				</xsl:otherwise>
    			</xsl:choose>
    			<xsl:text>&amp;objId=</xsl:text>
    			<xsl:value-of select="$objId"/>
    			<xsl:text>&amp;id=</xsl:text>
    			<xsl:value-of select="$id"/>
    			<xsl:text>&amp;scope=</xsl:text>
    			<xsl:value-of select="$scope"/>
    		</xsl:with-param>
    	</xsl:apply-templates>
      <menu>
      	<xsl:apply-templates select="$typeInfo/ed:menu/*">
      		<xsl:with-param name="node" select="."/>
      	</xsl:apply-templates>
        <xsl:if test="not($typeInfo/ed:menu/*)">
          <action label="Edit..." type="ShowEditAction"/>
          <action label="Clone" type="CloneAction"/>
          <action label="Cut" type="CutAction"/>
          <action label="Copy" type="CopyAction"/>
          <action label="Paste" type="PasteAction"/>
          <action label="Paste into" type="PasteIntoAction"/>
          <action label="Delete" type="DeleteAction"/>
        </xsl:if>
      </menu>
    </entity>
  </xsl:template>
  
  <xsl:template match="text()" mode="type">
    <xsl:text>_default/text</xsl:text>
  </xsl:template>
  
  <xsl:template match="comment()" mode="type">
    <xsl:text>_default/comment</xsl:text>
  </xsl:template>
  
  <xsl:template match="@*" mode="type">
    <xsl:text>_default/attribute</xsl:text>
  </xsl:template>
  
  <xsl:template match="*" mode="type">
    <xsl:text>_default/element</xsl:text>
  </xsl:template>
  
  <xsl:template match="t:namespace" mode="type">
    <xsl:text>_default/namespace</xsl:text>
  </xsl:template>
  
  <xsl:template match="c:*" mode="type">
    <xsl:value-of select="namespace-uri()"/>
    <xsl:text>/ObjectNode</xsl:text>
  </xsl:template>
  
	<xsl:template match="ed:action">
		<xsl:param name="node"/>
		<action>
			<xsl:apply-templates select="@*">
				<xsl:with-param name="node" select="$node"/>
			</xsl:apply-templates>
			<xsl:variable name="ns_nodes" select="namespace::*[(local-name(.) != 'xml') and (local-name(.) != '')]"/>
			<xsl:for-each-group group-by="." select="$ns_nodes">
				<namespace prefix="{local-name(.)}" uri="{.}"/>
			</xsl:for-each-group>
		</action>
	</xsl:template>
	
	<xsl:template match="ed:action/@*">
		<xsl:copy-of select="."/>
	</xsl:template>
	
	<xsl:template match="ed:action/@enable" priority="2">
		<xsl:param name="node"/>
		<xsl:apply-templates select="$node" mode="enable">
			<xsl:with-param name="action" select=".."/>
		</xsl:apply-templates>
	</xsl:template>
	
	<xsl:template match="ed:input | ed:editor">
		<xsl:param name="params"/>
		<xsl:variable name="uri">
			<xsl:text>EntityEditor.view?</xsl:text>
			<xsl:if test="@id">ed=<xsl:value-of select="@id"/>&amp;</xsl:if>
			<xsl:value-of select="$params"/>
		</xsl:variable>
		<editor>
			<xsl:copy-of select="@*"/>
			<xsl:copy-of select="document($uri)/*/node()"/>
		</editor>
	</xsl:template>
	
	<!-- TODO: generated stylesheet for editor and actions (to resolve XPaths) -->
	<xsl:template match="*" mode="enable">
	</xsl:template>
	
	<xsl:template match="doc:image" mode="enable">
		<xsl:param name="action"/>
		<xsl:variable name="e" select="$action/@enable"/>
		<xsl:choose>
			<xsl:when test="$e = 'matches(@ref, ''https?://'')' and matches(@ref, 'https?://')"/>
			<xsl:otherwise>
				<xsl:attribute name="disabled">1</xsl:attribute>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
	
</xsl:stylesheet>
